package com.yunbao.hujin.myjsfour;

import android.content.Context;
import android.util.Log;
import android.webkit.JavascriptInterface;
import android.webkit.WebView;
import android.widget.Toast;

/**
 * JS通过WebView调用 Android 代码 on 2017/11/23.
 * 1. 通过WebView的addJavascriptInterface（）进行对象映射
 * 2. 通过 WebViewClient 的shouldOverrideUrlLoading ()方法回调拦截 url
 *      【通过此方法调用Android的代码就不需要JsToAndroid类了】
 * 3. 通过 WebChromeClient 的onJsAlert()、onJsConfirm()、onJsPrompt（）方法回调拦截JS对话框alert()、confirm()、prompt（） 消息
 *      Js中有三个对话框：
 *      ______________________________________________________________________________________
 *     \  方法     \     作用       \    返回值      \      备注                             \
 *     \-------------------------------------------------------------------------------------\
 *     \  alert()  \    弹出警告框   \    没有        \    在文本加入\n可换行                \
 *     \-------------------------------------------------------------------------------------\
 *     \  confirm()\    弹出确认框   \   两个返回值    \     1.返回布尔值                    \
 *     \-------------------------------------------------------------------------------------\
 *     \  prompt() \    弹出输入框    \ 任意设置返回值 \ 1.点击"确认"：返回输入框的值；2."取消"：返回null                                                                             \
 *     \-------------------------------------------------------------------------------------\
 *
 */

public class JsToAndroid {

    private Context context;
    private WebView webView;

    public JsToAndroid(Context context, WebView webView) {
        this.context = context;
        this.webView = webView;
    }

    //Google 在Android 4.2 版本中规定对被调用的函数以 @JavascriptInterface进行注解从而避免漏洞攻击
    //    //在Android 4.2版本之前采用拦截prompt（）进行漏洞修复。
    // 被JS调用的方法必须加入@JavascriptInterface注解
    @JavascriptInterface
    public void hello(String msg) {
        //此处msg是JS 传过来的信息
//        System.out.println("JS调用了Android的hello方法");
        Log.e("JstoAndroid", "Js调用Android的hello方法" + "----" + msg);
        Toast.makeText(context, msg, Toast.LENGTH_SHORT).show();
    }


    @JavascriptInterface
    public void result(String msg){
        Log.e("JstoAndroid2222", "Js调用Android的result方法");

        //JS想要得到Android方法的返回值，只能通过 WebView 的 loadUrl()去执行 JS 方法把返回值传递回去
        // 实质就是Android调用JS的方法
        AndroidToJs.setLoadUrl(webView, "returnResult('"+"Android中的result值传给Js + " + msg + "')");//returnResult是Js中的一个方法
    }

}
